package com.zoro.interviewee.statictest.testclass;

/**
 * @author zhaoxingwu
 */
public class Person {

    private final String name = "person name";
    private final PersonOne one = new PersonOne();
    private final PersonTwo two = new PersonTwo();

    public void print() {
        System.out.println(one.text);
        System.out.println(two.text);
    }

    public class PersonOne{

        private final String name = "person one name";

        private Person pp = new Person();

        private final String text = "person one";
        private void printName() {
            /*
             4. 内部类可以直接访问外部类的私有属性，但是有下面两种情况
                - 使用一个变量访问外部类对象的属性
                - 不使用变量名直接访问外部类的属性 ，这时访问的是创建这个内部类时指定的那个外部类对象
                    `Person.PersonOne personOne = person.new PersonOne();`
                - 如果内部类有与外部类同名的属性，那么先访问的是内部类的 ,在这种情况下，如果要访问外部类的同名属性，需要指定类名和 this
             */
            System.out.println(name);
            System.out.println(Person.this.name);
            System.out.println(pp.name);
        }
    }

    public static class PersonTwo{

        private final Person person = new Person();

        private final String text = "person two";

        private void printName() {
            // 3. 嵌套类可以以直接访问外部类的实例的私有属性 ，但需要指定一个外部类的实例
            System.out.println(person.name);
        }
    }
}
